require( lme4 )
Loading required package: lme4
Loading required package: Matrix
package ‘Matrix’ was built under R version 3.4.1
Attaching package: ‘Matrix’
The following object is masked from ‘package:tidyr’:
expand
This dataset covers the period of 2000–2017 and includes 62560 records of fines levied against corporations relating to violations of regulations, from cases initiated by 43 federal regulatory agencies. I downloaded the data from the Good Jobs First “Violation Tracker”, using the search GUI with all the options set to <any>.
The Size of Penalties
This dataset contains fields for both Penalty_Amount and Penalty_Amount_Adjusted_For_Eliminating_Multiple_Counting, but is clear that these adjustments make very little difference to the data as a whole, as these two variables are correlation at r=0.994. I have thus elected to use the adjusted penalty values for all these analyses.
The first pattern to note is that (perhaps predictably) the penalties imposed via criminal proceedings tend to be larger than those imposed via civil proceedings, and larger still when both civil and criminal proceedings have been brought.

The way this pattern is built up is somewhat non-intuitive, as this linear model and boxplot makes clear. The groups mean are well-separated, and easy to distinguish statistically (small p-values), but there is so much variation within groups that the predictive value of the mean differences is small (low R2 value). The vast majority of penalties arise from civil actions – 99.3% of those recorded – and the mean value of these penalties is comparatively small.
summary( lm( Penalty_Adj ~ Civ_Crim_bin, data=viol ) )
Call:
lm(formula = Penalty_Adj ~ Civ_Crim_bin, data = viol)
Residuals:
Min 1Q Median 3Q Max
-5.913e+08 -4.644e+06 -4.640e+06 -4.627e+06 2.080e+10
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 596240136 24921654 23.93 <2e-16 ***
Civ_Crim_bincivil -591589764 24931682 -23.73 <2e-16 ***
Civ_Crim_bincriminal -464209918 26451988 -17.55 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 176200000 on 62557 degrees of freedom
Multiple R-squared: 0.01211, Adjusted R-squared: 0.01207
F-statistic: 383.3 on 2 and 62557 DF, p-value: < 2.2e-16
viol %>% filter( Penalty_Adj > 0 ) %>% ggplot( aes( Civ_Crim_bin, Penalty_Adj )) +
geom_point( colour="blue", alpha=0.3, position="jitter" ) +
geom_boxplot( outlier.size=0, alpha=0 ) +
coord_flip() +
xlab( "Type of case brought" ) +
scale_y_log10() +
ylab( "Penalty (log10 $'s)" )

Trends over Time
Modelling the relationship between penalty values and the year the penalty was imposed reveals an increasing trend, with the coefficent for year indicating an increase of ~$950k per year. However, the R2 value for this model indicates that it accounts for only 0.05% of the variation in the data.
This makes sense with reference to the scatter plot, where we can see that the trend for annual increase (represented by the dashed black line) is pretty modest when compared to huge variation in the size of penalties (note log10 scale).

Where are Violations Occurring?
Taking a broad-strokes view of the geographical data, we can see that there seems not to be a visually apparent trend in the locations where penalties are levied – this data appears to track pretty well with the locations of population centres, thought here may be more subtle patterns that are not visible at the nation-wide scale.
data( zipcode )
zipcode <- zipcode %>% mutate( zip=factor( zip ), region=substr( zip, 1, 1) )
full_join( viol, zipcode, by=c( "Zip" = "zip" ) ) %>% mutate( Zip=factor( Zip ) ) %>% filter( Civ_Crim_bin=="civil" ) %>%
ggplot() + geom_point( aes( x=longitude, y=latitude, col=Year ), cex=.5 ) +
theme_bw() + scale_x_continuous(limits = c(-125,-66), breaks = NULL ) +
scale_y_continuous(limits = c(25,50), breaks = NULL ) +
labs(x=NULL, y=NULL)

However, if we look the number of penalties paid in each state/territory over the course of this 18-yr dataset, we can see that there are many more violations in some states that others, with West Virginia being responsible for 15.22% of all penalties levied.

The bars are colored by the industrial sector of the parent corporation found liable for the penalty – the blue that occupies 93.43% of the West Virginia bar represents corporations classified as “mining and minerals”. It is apparent that WV is unusual in both the number of violations and the number of those violations related to mining.
What are Corporations being Fined For?
Across the 49 industrial sectors represented, it is immediately clear from this barplot the extent to which mining & mineral corporations are over-represented (25.24% of all penalties). It is also clear that the pink areas – indicating ‘workplace safety or health’ violations – comprise the majority of violations in most sectors, but particularly so in mining.
viol %>% filter( Facility_State != "" ) %>% ggplot( aes( reorder( Major_Industry_of_Parent, Major_Industry_of_Parent, function(x)-length(x) ) )) +
geom_bar( aes( fill=Primary_Offense )) +
coord_flip() +
theme( axis.text.y=element_text( hjust=0, size=6 ) ) +
ylab( "no. penalties" ) +
xlab( "" ) +
theme( legend.position="none" )




summary( lm( Penalty_Adj ~ Ownership_Structure, data=viol ) )
Call:
lm(formula = Penalty_Adj ~ Ownership_Structure, data = viol)
Residuals:
Min 1Q Median 3Q Max
-2.397e+07 -7.226e+06 -7.218e+06 -6.423e+06 2.079e+10
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 23974093 10234950 2.342 0.0192 *
Ownership_Structureprivately held -23300191 10350429 -2.251 0.0244 *
Ownership_Structurepublicly traded -16740801 10266208 -1.631 0.1030
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 177300000 on 62557 degrees of freedom
Multiple R-squared: 0.0002778, Adjusted R-squared: 0.0002458
F-statistic: 8.69 on 2 and 62557 DF, p-value: 0.0001684
summary( lm( Penalty_Adj ~ Facility_State, data=viol ) )
Call:
lm(formula = Penalty_Adj ~ Facility_State, data = viol)
Residuals:
Min 1Q Median 3Q Max
-3.370e+07 -1.822e+07 -2.563e+05 -8.214e+04 2.078e+10
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 18286776 1272342 14.373 < 2e-16 ***
Facility_StateAlabama -18025172 5189958 -3.473 0.000515 ***
Facility_StateAlaska -17819948 12040148 -1.480 0.138867
Facility_StateAmerican Samoa -17779976 125291812 -0.142 0.887153
Facility_StateArizona -18213383 7523135 -2.421 0.015481 *
Facility_StateArkansas -18157251 9940337 -1.827 0.067761 .
Facility_StateCalifornia -18120373 3613202 -5.015 5.32e-07 ***
Facility_StateColorado -18070030 5634389 -3.207 0.001341 **
Facility_StateConnecticut -18120035 8523108 -2.126 0.033508 *
Facility_StateDelaware -17472454 17763650 -0.984 0.325312
Facility_StateDistrict of Columbia -18256598 31347170 -0.582 0.560299
Facility_StateFlorida -17985468 6470401 -2.780 0.005443 **
Facility_StateGeorgia -18224910 6361712 -2.865 0.004174 **
Facility_StateGuam -18273209 49157427 -0.372 0.710096
Facility_StateHawaii -18222047 17018418 -1.071 0.284297
Facility_StateIdaho -16471900 14522550 -1.134 0.256703
Facility_StateIllinois -17996049 3831115 -4.697 2.64e-06 ***
Facility_StateIndiana -17475494 4916420 -3.555 0.000379 ***
Facility_StateIowa -18156113 9489436 -1.913 0.055715 .
Facility_StateKansas -18133620 9016436 -2.011 0.044311 *
Facility_StateKentucky -18241583 3200510 -5.700 1.21e-08 ***
Facility_StateLouisiana -17578982 8220109 -2.139 0.032477 *
Facility_StateMaine -18257097 15028420 -1.215 0.224432
Facility_StateMaryland -18034588 9165956 -1.968 0.049123 *
Facility_StateMassachusetts -17422929 7274225 -2.395 0.016616 *
Facility_StateMichigan -18154328 6821285 -2.661 0.007783 **
Facility_StateMinnesota -18236304 5908405 -3.087 0.002026 **
Facility_StateMississippi -18055166 10535728 -1.714 0.086587 .
Facility_StateMissouri -18089957 7654616 -2.363 0.018117 *
Facility_StateMontana -18055374 12500535 -1.444 0.148640
Facility_StateNebraska -18198953 11061670 -1.645 0.099928 .
Facility_StateNevada -18031237 5875831 -3.069 0.002151 **
Facility_StateNew Hampshire -18235103 16790237 -1.086 0.277459
Facility_StateNew Jersey -18140599 6309489 -2.875 0.004040 **
Facility_StateNew Mexico -18158949 10917648 -1.663 0.096264 .
Facility_StateNew York -18108973 5287261 -3.425 0.000615 ***
Facility_StateNorth Carolina -17502134 6779308 -2.582 0.009834 **
Facility_StateNorth Dakota -18244123 20498538 -0.890 0.373458
Facility_StateNorthern Mariana Islands -18265388 177184812 -0.103 0.917895
Facility_StateOhio -16541211 4725096 -3.501 0.000464 ***
Facility_StateOklahoma -18148139 9529064 -1.905 0.056849 .
Facility_StateOregon -18184211 14768926 -1.231 0.218235
Facility_StatePennsylvania -18108068 4366808 -4.147 3.38e-05 ***
Facility_StatePuerto Rico -18011010 11368026 -1.584 0.113118
Facility_StateRhode Island -17500532 20919620 -0.837 0.402843
Facility_StateSouth Carolina -18218457 10208322 -1.785 0.074320 .
Facility_StateSouth Dakota -8620063 26443099 -0.326 0.744437
Facility_StateTennessee -18180665 6470401 -2.810 0.004958 **
Facility_StateTexas -17907249 3610898 -4.959 7.10e-07 ***
Facility_StateUtah -18016764 8096628 -2.225 0.026070 *
Facility_StateVermont -18023624 45765432 -0.394 0.693711
Facility_StateVirgin Islands of the U.S. 15412764 38684828 0.398 0.690323
Facility_StateVirginia -17142463 5158794 -3.323 0.000891 ***
Facility_StateWashington -18194236 8358478 -2.177 0.029504 *
Facility_StateWest Virginia -18199133 2529098 -7.196 6.27e-13 ***
Facility_StateWisconsin -14772491 7555345 -1.955 0.050560 .
Facility_StateWyoming -18171775 9778005 -1.858 0.063112 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 177200000 on 62503 degrees of freedom
Multiple R-squared: 0.002203, Adjusted R-squared: 0.001309
F-statistic: 2.464 on 56 and 62503 DF, p-value: 7.378e-09
summary( lm( Penalty_Adj ~ Year, data=viol[ viol$Civ_Crim_bin=="civil", ] ) )
summary( lmer( Penalty_Adj ~ Year + Civ_Crim_bin + ( Year | Facility_State ), data=viol ) )
LS0tCnRpdGxlOiAiRGF0YSBJbmN1YmF0b3IgQ2hhbGxlbmdlIC0gUXVlc3Rpb24gMzogUHJvamVjdCBwaXRjaCIKYXV0aG9yOiAiV2lsbCBQaXRjaGVycyIKZGF0ZTogIlNhdHVyZGF5LCAyOCBPY3RvYmVyIDIwMTciCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIGxvYWQgcGFja2FnZXN9CnJlcXVpcmUoIHRpZHl2ZXJzZSApCnJlcXVpcmUoIGRhdGEudGFibGUgKQpyZXF1aXJlKCBtYXBzICkKcmVxdWlyZSggemlwY29kZSApCnJlcXVpcmUoIGxtZTQgKQpgYGAKClRoaXMgZGF0YXNldCBjb3ZlcnMgdGhlIHBlcmlvZCBvZiAyMDAwLS0yMDE3IGFuZCBpbmNsdWRlcyA2MjU2MCByZWNvcmRzIG9mIGZpbmVzIGxldmllZCBhZ2FpbnN0IGNvcnBvcmF0aW9ucyByZWxhdGluZyB0byB2aW9sYXRpb25zIG9mIHJlZ3VsYXRpb25zLCBmcm9tIGNhc2VzIGluaXRpYXRlZCBieSA0MyBmZWRlcmFsIHJlZ3VsYXRvcnkgYWdlbmNpZXMuIEkgZG93bmxvYWRlZCB0aGUgZGF0YSBmcm9tIHRoZSBHb29kIEpvYnMgRmlyc3QgWyJWaW9sYXRpb24gVHJhY2tlciJdKGh0dHBzOi8vd3d3Lmdvb2Rqb2JzZmlyc3Qub3JnL3Zpb2xhdGlvbi10cmFja2VyKSwgdXNpbmcgdGhlIHNlYXJjaCBHVUkgd2l0aCBhbGwgdGhlIG9wdGlvbnMgc2V0IHRvIGA8YW55PmAuCgoKYGBge3IgcmVhZCBpbiBkYXRhfQp2aW9sIDwtIHRibF9kZiggZnJlYWQoICIvVXNlcnMvd2lsbHBpdGNoZXJzL0RvY3VtZW50cy89Sm9iX0FwcGxpY2F0aW9uc19ldGMvRGF0YV9JbmN1YmF0b3JfMjAxNy92aW9sYXRpb25fdHJhY2tlcl9leHBvcnQuY3N2IiApKQoKbmFtZXMoIHZpb2wgKSA8LSBnc3ViKCAiICIsICJfIiwgbmFtZXMoIHZpb2wgKSkKCnZpb2wgPC0gdmlvbCAlPiUgbXV0YXRlKCBZZWFyPWFzLmludGVnZXIoIFllYXIgKSwgSW5kdXN0cnlfY29kZT1mYWN0b3IoIEluZHVzdHJ5X2luX1JlY29yZCApLCBDaXZfQ3JpbT1mYWN0b3IoIGBDaXZpbC9DcmltaW5hbGAgKSApICU+JQogICAgICAgICAgICAgICAgICBtdXRhdGUoIEhRX1N0YXRlX29mX1BhcmVudD1mYWN0b3IoIEhRX1N0YXRlX29mX1BhcmVudCApLCBIUV9Db3VudHJ5X29mX1BhcmVudD1mYWN0b3IoIEhRX0NvdW50cnlfb2ZfUGFyZW50ICkgKSAlPiUKICAgICAgICAgICAgICAgICAgbXV0YXRlKCBQcmltYXJ5X09mZmVuc2U9ZmFjdG9yKCBQcmltYXJ5X09mZmVuc2UgKSwgUGVuYWx0eV9BbW91bnQ9YXMubnVtZXJpYyggZ3N1YiggIlskLF0iLCAiIiwgUGVuYWx0eV9BbW91bnQgKSApICkgJT4lIAogICAgICAgICAgICAgICAgICBtdXRhdGUoIFBlbmFsdHlfQWRqPWFzLm51bWVyaWMoIGdzdWIoICJbJCxdIiwgIiIsIFBlbmFsdHlfQW1vdW50X0FkanVzdGVkX0Zvcl9FbGltaW5hdGluZ19NdWx0aXBsZV9Db3VudGluZyApKSApICU+JSAKICAgICAgICAgICAgICAgICAgbXV0YXRlKCBTdWJ0cmFjdGlvbl9Gcm9tX1BlbmFsdHk9YXMubnVtZXJpYyggIlskLF0iLCAiIiwgU3VidHJhY3Rpb25fRnJvbV9QZW5hbHR5ICkgKSAlPiUgCiAgICAgICAgICAgICAgICAgIG11dGF0ZSggQWdlbmN5PWZhY3RvciggQWdlbmN5ICksIFNlY29uZGFyeV9PZmZlbnNlPWZhY3RvciggU2Vjb25kYXJ5X09mZmVuc2UgKSwgT3duZXJzaGlwX1N0cnVjdHVyZT1mYWN0b3IoIE93bmVyc2hpcF9TdHJ1Y3R1cmUgKSApICU+JSAKICAgICAgICAgICAgICAgICAgbXV0YXRlKCBNYWpvcl9JbmR1c3RyeV9vZl9QYXJlbnQ9ZmFjdG9yKCBNYWpvcl9JbmR1c3RyeV9vZl9QYXJlbnQgKSwgWmlwPWZhY3RvciggWmlwICksIEZhY2lsaXR5X1N0YXRlPWZhY3RvciggRmFjaWxpdHlfU3RhdGUgKSApCgp2aW9sIDwtIHZpb2wgJT4lIG11dGF0ZSggQ2l2X0NyaW1fYmluPWZhY3RvciggaWZlbHNlKCBncmVwbCggImNpdmlsIGFuZCBjcmltaW5hbCIsIGBDaXZpbC9DcmltaW5hbGAgKT09IlRSVUUiLCAiYm90aCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKCBncmVwbCggImNpdmlsIiwgYENpdmlsL0NyaW1pbmFsYCApPT0iVFJVRSIsICJjaXZpbCIsICJjcmltaW5hbCIgKSkpKQoKIyBzdHIoIHZpb2wgKQojIHN1bW1hcnkoIHZpb2wkWWVhciApCnZpb2wKYGBgCgojIyBUaGUgU2l6ZSBvZiBQZW5hbHRpZXMKClRoaXMgZGF0YXNldCBjb250YWlucyBmaWVsZHMgZm9yIGJvdGggYFBlbmFsdHlfQW1vdW50YCBhbmQgYFBlbmFsdHlfQW1vdW50X0FkanVzdGVkX0Zvcl9FbGltaW5hdGluZ19NdWx0aXBsZV9Db3VudGluZ2AsIGJ1dCBpcyBjbGVhciB0aGF0IHRoZXNlIGFkanVzdG1lbnRzIG1ha2UgdmVyeSBsaXR0bGUgZGlmZmVyZW5jZSB0byB0aGUgZGF0YSBhcyBhIHdob2xlLCBhcyB0aGVzZSB0d28gdmFyaWFibGVzIGFyZSBjb3JyZWxhdGlvbiBhdCByPWByIHJvdW5kKCBjb3IoIHZpb2wkUGVuYWx0eV9BbW91bnQsIHZpb2wkUGVuYWx0eV9BZGogKSwgMylgLiBJIGhhdmUgdGh1cyBlbGVjdGVkIHRvIHVzZSB0aGUgYWRqdXN0ZWQgcGVuYWx0eSB2YWx1ZXMgZm9yIGFsbCB0aGVzZSBhbmFseXNlcy4KClRoZSBmaXJzdCBwYXR0ZXJuIHRvIG5vdGUgaXMgdGhhdCAocGVyaGFwcyBwcmVkaWN0YWJseSkgdGhlIHBlbmFsdGllcyBpbXBvc2VkIHZpYSAqY3JpbWluYWwqIHByb2NlZWRpbmdzIHRlbmQgdG8gYmUgbGFyZ2VyIHRoYW4gdGhvc2UgaW1wb3NlZCB2aWEgKmNpdmlsKiBwcm9jZWVkaW5ncywgYW5kIGxhcmdlciBzdGlsbCB3aGVuIGJvdGggY2l2aWwgKmFuZCogY3JpbWluYWwgcHJvY2VlZGluZ3MgaGF2ZSBiZWVuIGJyb3VnaHQuCgpgYGB7ciBwZW5hbHR5IGNpdiB2cy4gY3JpbX0KdmlvbCAlPiUgZmlsdGVyKCBQZW5hbHR5X0FkaiA+IDAgKSAlPiUgZ2dwbG90KCBhZXMoIFBlbmFsdHlfQWRqICkpICsgCiAgICAgICAgICBnZW9tX2RlbnNpdHkoIGFlcyggY29sPUNpdl9DcmltX2JpbiwgZmlsbD1DaXZfQ3JpbV9iaW4gKSwgYWxwaGE9LjUgKSArIAogICAgICAgICAgc2NhbGVfeF9sb2cxMCgpICsgCiAgICAgICAgICB4bGFiKCAiUGVuYWx0eSAobG9nMTAgJCdzKSIgKSArIAogICAgICAgICAgc2NhbGVfZmlsbF9kaXNjcmV0ZSggbmFtZT0iVHlwZSBvZlxuY2FzZSBicm91Z2h0IikgKyAKICAgICAgICAgIHNjYWxlX2NvbG91cl9kaXNjcmV0ZSggbmFtZT0iVHlwZSBvZlxuY2FzZSBicm91Z2h0IiApCmBgYAoKVGhlIHdheSB0aGlzIHBhdHRlcm4gaXMgYnVpbHQgdXAgaXMgc29tZXdoYXQgbm9uLWludHVpdGl2ZSwgYXMgdGhpcyBsaW5lYXIgbW9kZWwgYW5kIGJveHBsb3QgbWFrZXMgY2xlYXIuIFRoZSBncm91cHMgbWVhbiBhcmUgd2VsbC1zZXBhcmF0ZWQsIGFuZCBlYXN5IHRvIGRpc3Rpbmd1aXNoIHN0YXRpc3RpY2FsbHkgKHNtYWxsIHAtdmFsdWVzKSwgYnV0IHRoZXJlIGlzIHNvIG11Y2ggdmFyaWF0aW9uIHdpdGhpbiBncm91cHMgdGhhdCB0aGUgcHJlZGljdGl2ZSB2YWx1ZSBvZiB0aGUgbWVhbiBkaWZmZXJlbmNlcyBpcyBzbWFsbCAobG93IFJeMl4gdmFsdWUpLiBUaGUgdmFzdCBtYWpvcml0eSBvZiBwZW5hbHRpZXMgYXJpc2UgZnJvbSBjaXZpbCBhY3Rpb25zIC0tIGByIHJvdW5kKGxlbmd0aCh2aW9sJFBlbmFsdHlfQWRqW3Zpb2wkQ2l2X0NyaW1fYmluPT0iY2l2aWwiXSkvbGVuZ3RoKHZpb2wkUGVuYWx0eV9BZGopKjEwMCwxKWAlIG9mIHRob3NlIHJlY29yZGVkIC0tIGFuZCB0aGUgbWVhbiB2YWx1ZSBvZiB0aGVzZSBwZW5hbHRpZXMgaXMgY29tcGFyYXRpdmVseSBzbWFsbC4KCmBgYHtyIG5vLnMgY3JpbSB2cy4gY2l2LCBmaWcua2VlcD0nbGFzdCd9CnN1bW1hcnkoIGxtKCBQZW5hbHR5X0FkaiB+IENpdl9DcmltX2JpbiwgZGF0YT12aW9sICkgKQoKdmlvbCAlPiUgZmlsdGVyKCBQZW5hbHR5X0FkaiA+IDAgKSAlPiUgZ2dwbG90KCBhZXMoIENpdl9DcmltX2JpbiwgUGVuYWx0eV9BZGogKSkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoIGNvbG91cj0iYmx1ZSIsIGFscGhhPTAuMywgcG9zaXRpb249ImppdHRlciIgKSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLnNpemU9MCwgYWxwaGE9MCApICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZF9mbGlwKCkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIoICJUeXBlIG9mIGNhc2UgYnJvdWdodCIgKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV95X2xvZzEwKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiggIlBlbmFsdHkgKGxvZzEwICQncykiICkKYGBgCgojIyBUcmVuZHMgb3ZlciBUaW1lCgpNb2RlbGxpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBlbmFsdHkgdmFsdWVzIGFuZCB0aGUgeWVhciB0aGUgcGVuYWx0eSB3YXMgaW1wb3NlZCByZXZlYWxzIGFuIGluY3JlYXNpbmcgdHJlbmQsIHdpdGggdGhlIGNvZWZmaWNlbnQgZm9yIHllYXIgaW5kaWNhdGluZyBhbiBpbmNyZWFzZSBvZiB+JDk1MGsgcGVyIHllYXIuIEhvd2V2ZXIsIHRoZSBSXjJeIHZhbHVlIGZvciB0aGlzIG1vZGVsIGluZGljYXRlcyB0aGF0IGl0IGFjY291bnRzIGZvciBvbmx5IDAuMDUlIG9mIHRoZSB2YXJpYXRpb24gaW4gdGhlIGRhdGEuIAoKVGhpcyBtYWtlcyBzZW5zZSB3aXRoIHJlZmVyZW5jZSB0byB0aGUgc2NhdHRlciBwbG90LCB3aGVyZSB3ZSBjYW4gc2VlIHRoYXQgdGhlIHRyZW5kIGZvciBhbm51YWwgaW5jcmVhc2UgKHJlcHJlc2VudGVkIGJ5IHRoZSBkYXNoZWQgYmxhY2sgbGluZSkgaXMgcHJldHR5IG1vZGVzdCB3aGVuIGNvbXBhcmVkIHRvICpodWdlKiB2YXJpYXRpb24gaW4gdGhlIHNpemUgb2YgcGVuYWx0aWVzIChub3RlIGxvZ14xMF4gc2NhbGUpLgoKYGBge3IgcGVuYWx0eSBieSB5ZWFyfQpzdW1tYXJ5KCBsbSggUGVuYWx0eV9BZGogfiBZZWFyLCBkYXRhPXZpb2wgKSApCgp2aW9sICU+JSBmaWx0ZXIoIFBlbmFsdHlfQWRqID4gMCApICU+JSBnZ3Bsb3QoIGFlcyggeD1ZZWFyLCB5PVBlbmFsdHlfQWRqICkgKSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9qaXR0ZXIoIGFlcyggY29sPUNpdl9DcmltX2JpbiApLCBhbHBoYT0wLjUsIHdpZHRoPS4yLCBoZWlnaHQ9MCApICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIoICJQZW5hbHR5IGFtb3VudCAobG9nMTAgJCdzKSIgKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX3Ntb290aCggbWV0aG9kPSJsbSIsIGNvbD0iYmxhY2siLCBsdHk9MiApICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jb2xvdXJfZGlzY3JldGUoIG5hbWU9IlR5cGUgb2ZcbmNhc2UgYnJvdWdodCIgKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV95X2xvZzEwKCkKYGBgCgojIyBXaGVyZSBhcmUgVmlvbGF0aW9ucyBPY2N1cnJpbmc/CgpUYWtpbmcgYSBicm9hZC1zdHJva2VzIHZpZXcgb2YgdGhlIGdlb2dyYXBoaWNhbCBkYXRhLCB3ZSBjYW4gc2VlIHRoYXQgdGhlcmUgc2VlbXMgbm90IHRvIGJlIGEgdmlzdWFsbHkgYXBwYXJlbnQgdHJlbmQgaW4gdGhlIGxvY2F0aW9ucyB3aGVyZSBwZW5hbHRpZXMgYXJlIGxldmllZCAtLSB0aGlzIGRhdGEgYXBwZWFycyB0byB0cmFjayBwcmV0dHkgd2VsbCB3aXRoIHRoZSBsb2NhdGlvbnMgb2YgcG9wdWxhdGlvbiBjZW50cmVzLCB0aG91Z2h0IGhlcmUgbWF5IGJlIG1vcmUgc3VidGxlIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCB2aXNpYmxlIGF0IHRoZSBuYXRpb24td2lkZSBzY2FsZS4KCmBgYHtyIHBlbmFsdHkgbWFwLCB3YXJuaW5nPUZBTFNFfQpkYXRhKCB6aXBjb2RlICkKemlwY29kZSA8LSB6aXBjb2RlICU+JSBtdXRhdGUoIHppcD1mYWN0b3IoIHppcCApLCByZWdpb249c3Vic3RyKCB6aXAsIDEsIDEpICkKCmZ1bGxfam9pbiggdmlvbCwgemlwY29kZSwgYnk9YyggIlppcCIgPSAiemlwIiApICkgJT4lIG11dGF0ZSggWmlwPWZhY3RvciggWmlwICkgKSAlPiUgZmlsdGVyKCBDaXZfQ3JpbV9iaW49PSJjaXZpbCIgKSAlPiUgCiAgICBnZ3Bsb3QoKSArIGdlb21fcG9pbnQoIGFlcyggeD1sb25naXR1ZGUsIHk9bGF0aXR1ZGUsIGNvbD1ZZWFyICksIGNleD0uNSApICsgCiAgICAgICAgdGhlbWVfYncoKSArIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0xMjUsLTY2KSwgYnJlYWtzID0gTlVMTCApICsgCiAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMjUsNTApLCBicmVha3MgPSBOVUxMICkgKyAKICAgICAgICBsYWJzKHg9TlVMTCwgeT1OVUxMKQoKYGBgCgpIb3dldmVyLCBpZiB3ZSBsb29rIHRoZSBudW1iZXIgb2YgcGVuYWx0aWVzIHBhaWQgaW4gZWFjaCBzdGF0ZS90ZXJyaXRvcnkgb3ZlciB0aGUgY291cnNlIG9mIHRoaXMgMTgteXIgZGF0YXNldCwgd2UgY2FuIHNlZSB0aGF0IHRoZXJlIGFyZSAqbWFueSogbW9yZSB2aW9sYXRpb25zIGluIHNvbWUgc3RhdGVzIHRoYXQgb3RoZXJzLCB3aXRoIFdlc3QgVmlyZ2luaWEgYmVpbmcgcmVzcG9uc2libGUgZm9yIGByIHJvdW5kKG5yb3codmlvbFt2aW9sJEZhY2lsaXR5X1N0YXRlPT0iV2VzdCBWaXJnaW5pYSIsXSkvbnJvdyh2aW9sW3Zpb2wkRmFjaWxpdHlfU3RhdGUhPSIiLF0pKjEwMCwyKWAlIG9mIGFsbCBwZW5hbHRpZXMgbGV2aWVkLiAKCmBgYHtyfQp2aW9sICU+JSBmaWx0ZXIoIEZhY2lsaXR5X1N0YXRlICE9ICIiICkgJT4lIGdncGxvdCggYWVzKCByZW9yZGVyKCBGYWNpbGl0eV9TdGF0ZSwgRmFjaWxpdHlfU3RhdGUsIGZ1bmN0aW9uKHgpLWxlbmd0aCh4KSApICkpICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX2JhciggYWVzKCBmaWxsPU1ham9yX0luZHVzdHJ5X29mX1BhcmVudCApKSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRfZmxpcCgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoIGhqdXN0PTAsIHNpemU9NiApICkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiggIm5vLiBwZW5hbHRpZXMiICkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIoICIiICkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKCBsZWdlbmQucG9zaXRpb249Im5vbmUiICkKYGBgCgpUaGUgYmFycyBhcmUgY29sb3JlZCBieSB0aGUgaW5kdXN0cmlhbCBzZWN0b3Igb2YgdGhlIHBhcmVudCBjb3Jwb3JhdGlvbiBmb3VuZCBsaWFibGUgZm9yIHRoZSBwZW5hbHR5IC0tIHRoZSBibHVlIHRoYXQgb2NjdXBpZXMgYHIgcm91bmQoIG5yb3codmlvbFt2aW9sJEZhY2lsaXR5X1N0YXRlPT0iV2VzdCBWaXJnaW5pYSImdmlvbCRNYWpvcl9JbmR1c3RyeV9vZl9QYXJlbnQ9PSJtaW5pbmcgYW5kIG1pbmVyYWxzIixdKSAvIG5yb3codmlvbFt2aW9sJEZhY2lsaXR5X1N0YXRlPT0iV2VzdCBWaXJnaW5pYSIsXSkqMTAwLDIpYCUgb2YgdGhlIFdlc3QgVmlyZ2luaWEgYmFyIHJlcHJlc2VudHMgY29ycG9yYXRpb25zIGNsYXNzaWZpZWQgYXMgIm1pbmluZyBhbmQgbWluZXJhbHMiLiBJdCBpcyBhcHBhcmVudCB0aGF0IFdWIGlzIHVudXN1YWwgaW4gYm90aCB0aGUgbnVtYmVyIG9mIHZpb2xhdGlvbnMgKmFuZCogdGhlIG51bWJlciBvZiB0aG9zZSB2aW9sYXRpb25zIHJlbGF0ZWQgdG8gbWluaW5nLgoKIyMgV2hhdCBhcmUgQ29ycG9yYXRpb25zIGJlaW5nIEZpbmVkIEZvcj8KCkFjcm9zcyB0aGUgNDkgaW5kdXN0cmlhbCBzZWN0b3JzIHJlcHJlc2VudGVkLCBpdCBpcyBpbW1lZGlhdGVseSBjbGVhciBmcm9tIHRoaXMgYmFycGxvdCB0aGUgZXh0ZW50IHRvIHdoaWNoIG1pbmluZyAmIG1pbmVyYWwgY29ycG9yYXRpb25zIGFyZSBvdmVyLXJlcHJlc2VudGVkIChgciByb3VuZCggbnJvdyh2aW9sW3Zpb2wkTWFqb3JfSW5kdXN0cnlfb2ZfUGFyZW50PT0ibWluaW5nIGFuZCBtaW5lcmFscyIsXSkgLyBucm93KHZpb2wpKjEwMCwyKWAlIG9mIGFsbCBwZW5hbHRpZXMpLiBJdCBpcyBhbHNvIGNsZWFyIHRoYXQgdGhlIHBpbmsgYXJlYXMgLS0gaW5kaWNhdGluZyAnd29ya3BsYWNlIHNhZmV0eSBvciBoZWFsdGgnIHZpb2xhdGlvbnMgLS0gY29tcHJpc2UgdGhlIG1ham9yaXR5IG9mIHZpb2xhdGlvbnMgaW4gbW9zdCBzZWN0b3JzLCBidXQgcGFydGljdWxhcmx5IHNvIGluIG1pbmluZy4KCmBgYHtyfQp2aW9sICU+JSBmaWx0ZXIoIEZhY2lsaXR5X1N0YXRlICE9ICIiICkgJT4lIGdncGxvdCggYWVzKCByZW9yZGVyKCBNYWpvcl9JbmR1c3RyeV9vZl9QYXJlbnQsIE1ham9yX0luZHVzdHJ5X29mX1BhcmVudCwgZnVuY3Rpb24oeCktbGVuZ3RoKHgpICkgKSkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fYmFyKCBhZXMoIGZpbGw9UHJpbWFyeV9PZmZlbnNlICkpICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZF9mbGlwKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUoIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dCggaGp1c3Q9MCwgc2l6ZT02ICkgKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bGFiKCAibm8uIHBlbmFsdGllcyIgKSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiggIiIgKSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUoIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIgKQpgYGAKCmBgYHtyfQp2aW9sICU+JSBmaWx0ZXIoIEZhY2lsaXR5X1N0YXRlPT0iV2VzdCBWaXJnaW5pYSIgKSAlPiUgZ2dwbG90KCBhZXMoIHJlb3JkZXIoIE1ham9yX0luZHVzdHJ5X29mX1BhcmVudCwgTWFqb3JfSW5kdXN0cnlfb2ZfUGFyZW50LCBmdW5jdGlvbih4KS1sZW5ndGgoeCkpICkpICsgZ2VvbV9iYXIoKSArIGNvb3JkX2ZsaXAoKQpgYGAKCgpgYGB7cn0Kc3VtbWFyeSggdmlvbCRNYWpvcl9JbmR1c3RyeV9vZl9QYXJlbnQgKQp2aW9sICU+JSBnZ3Bsb3QoIGFlcyggcmVvcmRlciggTWFqb3JfSW5kdXN0cnlfb2ZfUGFyZW50LCBNYWpvcl9JbmR1c3RyeV9vZl9QYXJlbnQsIGZ1bmN0aW9uKHgpLWxlbmd0aCh4KSkgKSkgKyBnZW9tX2JhcigpICsgY29vcmRfZmxpcCgpCmBgYAoKYGBge3J9CnN1bW1hcnkoIHZpb2wkUHJpbWFyeV9PZmZlbnNlICkKdmlvbCAlPiUgZ2dwbG90KCBhZXMoIHJlb3JkZXIoIFByaW1hcnlfT2ZmZW5zZSwgUHJpbWFyeV9PZmZlbnNlLCBmdW5jdGlvbih4KS1sZW5ndGgoeCkpICkpICsgZ2VvbV9iYXIoKSArIGNvb3JkX2ZsaXAoKQpgYGAKIAoKYGBge3J9CnZpb2wgJT4lIGZpbHRlciggUGVuYWx0eV9BZGogPiAwICkgJT4lIGdncGxvdCggYWVzKCBQZW5hbHR5X0FkaiApKSArIGdlb21fZGVuc2l0eSggYWVzKCBjb2w9T3duZXJzaGlwX1N0cnVjdHVyZSwgZmlsbD1Pd25lcnNoaXBfU3RydWN0dXJlICksIGFscGhhPS41ICkgKyBzY2FsZV94X2xvZzEwKCkKCnN1bW1hcnkoIGxtKCBQZW5hbHR5X0FkaiB+IE93bmVyc2hpcF9TdHJ1Y3R1cmUsIGRhdGE9dmlvbCApICkKYGBgCgoKYGBge3J9CnZpb2wgJT4lIGZpbHRlciggRmFjaWxpdHlfU3RhdGUgIT0gIiIgKSAlPiUgY291bnQoIFByaW1hcnlfT2ZmZW5zZSwgRmFjaWxpdHlfU3RhdGUgKSAlPiUgYXJyYW5nZSggLW4gKSAKdmlvbCAlPiUgZmlsdGVyKCBGYWNpbGl0eV9TdGF0ZSAhPSAiIiApICU+JSBjb3VudCggRmFjaWxpdHlfU3RhdGUsIE1ham9yX0luZHVzdHJ5X29mX1BhcmVudCApICU+JSBhcnJhbmdlKCAtbiApIAoKdmlvbCAlPiUgZmlsdGVyKCBGYWNpbGl0eV9TdGF0ZSAhPSAiIiApICU+JSBjb3VudCggRmFjaWxpdHlfU3RhdGUsIFByaW1hcnlfT2ZmZW5zZSwgTWFqb3JfSW5kdXN0cnlfb2ZfUGFyZW50ICkgJT4lIGFycmFuZ2UoIC1uICkgCgp2aW9sICU+JSBmaWx0ZXIoIEZhY2lsaXR5X1N0YXRlICE9ICIiICkgJT4lIGNvdW50KCBQcmltYXJ5X09mZmVuc2UsIEZhY2lsaXR5X1N0YXRlICkgJT4lIGFycmFuZ2UoIC1uICkgJT4lIAogICAgICAgIGdncGxvdCggYWVzKCBQcmltYXJ5X09mZmVuc2UsIEZhY2lsaXR5X1N0YXRlICkgKSArIGdlb21fdGlsZSggYWVzKCBmaWxsPW4gKSwgY29sPSJ3aGl0ZSIgKSArIAogICAgICAgICAgc2NhbGVfZmlsbF9ncmFkaWVudCggbG93ID0gIndoaXRlIiwgaGlnaCA9ICJzdGVlbGJsdWUiICkgKyB0aGVtZV9taW5pbWFsKCkgKyAKICAgICAgICAgICAgdGhlbWUoIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KCBhbmdsZT0zMzAsIGhqdXN0PTAsIHNpemU9OCApLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoIGhqdXN0PTAsIHNpemU9NiApICkKCnZpb2wgJT4lIGZpbHRlciggRmFjaWxpdHlfU3RhdGUgIT0gIiIgKSAlPiUgY291bnQoIE1ham9yX0luZHVzdHJ5X29mX1BhcmVudCwgRmFjaWxpdHlfU3RhdGUgKSAlPiUgYXJyYW5nZSggLW4gKSAKYGBgCgpgYGB7cn0Kc3VtbWFyeSggbG0oIFBlbmFsdHlfQWRqIH4gWWVhciAgKyBQcmltYXJ5X09mZmVuc2UgKyBGYWNpbGl0eV9TdGF0ZSwgZGF0YT12aW9sICkgKQpgYGAKCgoKCmBgYHtyfQpzdW1tYXJ5KCBsbSggUGVuYWx0eV9BZGogfiBZZWFyLCBkYXRhPXZpb2xbIHZpb2wkQ2l2X0NyaW1fYmluPT0iY2l2aWwiLCBdICkgKQoKCnN1bW1hcnkoIGxtZXIoIFBlbmFsdHlfQWRqIH4gWWVhciArIENpdl9DcmltX2JpbiArICggWWVhciB8IEZhY2lsaXR5X1N0YXRlICksIGRhdGE9dmlvbCApICkKYGBgCg==